﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections.ObjectModel;
using Zzva.DomainObject;
using Zzva.Common;
using System.Collections;
using Zzva.ESB;

namespace Zzva.DomainObjectReg
{

    public class TRegDirSoftType : TRegDirBase
    {

        private static TRegDirSoftType mvarRegDirSoftType;

        public void Delete()
        {
            try
            {
                TDirBase lCurDir;
                Collection<TDirBase> lCurListDir;
                int lIdAfterDelete;

                lCurListDir = GetCurList();
                lCurDir = GetCurItem();

                lIdAfterDelete = GetIdAfterDelete(lCurDir, lCurListDir);

                if (lIdAfterDelete == -1) { throw (new CommonException("Нет текущего элемента в коллекции")); }

                TDirSoftTypeBase lDirSoftTypeBase = (TDirSoftTypeBase)lCurDir;
                Esb.DeleteSoftType(ref lDirSoftTypeBase);
                TDirSoftTypeNull lDirSoftTypeNull = (TDirSoftTypeNull)lDirSoftTypeBase;
                Collection<TDirSoftType> lListDir = Esb.GetListSoftType();

                Collection<TDirBase> lListDirBase = new Collection<TDirBase>();
                foreach (TDirSoftType h in lListDir) { lListDirBase.Add((TDirBase)h); }

                TDirBase lCurItem;
                if (lIdAfterDelete > 0) { lCurItem = GetItemById(lIdAfterDelete, lListDirBase); }
                else if (lIdAfterDelete == 0) { lCurItem = null; }
                else if (lIdAfterDelete == -1) { throw (new CommonException("Нет текущего элемента в коллекции")); }
                else { throw (new CommonException("Нет значения возврата для GetIdAfterDelete")); }

                mvarFullListDir = lListDirBase;
                mvarCurItem = lCurItem;


                ////
                mvarFlgSinhroCurListAndCurState = false;


                //дальше здесь событие что обновлено
                FireEventUpdateList(EventArgs.Empty);
            }
            catch (Exception e1) { throw e1; }
            finally { }
        }

        //Редактирует текущую элемент справочника, на вход объект TDirSoftTypeNew  с новыми знвчениями текщей записи
        public void Edit(TDirSoftTypeNew pDir)
        {
            try
            {
                TDirBase lCurDir;

                //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                //Тут бы желательно открыть транзакцию

                lCurDir = this.GetCurItem();
                lCurDir.Obozn = pDir.Obozn;
                lCurDir.Naim = pDir.Naim;


                TDirSoftTypeBase lDirSoftTypeBase = (TDirSoftTypeBase)lCurDir;
                Esb.SaveSoftType(ref lDirSoftTypeBase);
                TDirSoftType lDirSoftType = (TDirSoftType)lDirSoftTypeBase;
                Collection<TDirSoftType> lListDir = Esb.GetListSoftType();

                Collection<TDirBase> lListDirBase = new Collection<TDirBase>();
                foreach (TDirSoftType h in lListDir)
                {
                    lListDirBase.Add((TDirBase)h);
                }

                TDirBase lCurItem;
                lCurItem = GetItemById(lDirSoftType.Id, lListDirBase);

                mvarFullListDir = lListDirBase;
                mvarCurItem = lCurItem;


                ////
                mvarFlgSinhroCurListAndCurState = false;


                //дальше здесь событие что обновлено
                FireEventUpdateList(EventArgs.Empty);
            }
            catch (Exception e1) { throw e1; }
            finally { }
        }


        //Добавляет элемент справочника и делает его текущим
        public void Add(TDirSoftTypeNew pDir)
        {
            try
            {
                TDirSoftTypeBase lDirSoftTypeBase = (TDirSoftTypeBase)pDir;
                Esb.SaveSoftType(ref lDirSoftTypeBase);
                TDirSoftType lDirSoftType = (TDirSoftType)lDirSoftTypeBase;
                Collection<TDirSoftType> lListDir = Esb.GetListSoftType();


                Collection<TDirBase> lListDirBase = new Collection<TDirBase>();
                foreach (TDirSoftType h in lListDir)
                {
                    lListDirBase.Add((TDirBase)h);
                }


                TDirBase lCurItem;
                lCurItem = GetItemById(lDirSoftType.Id, lListDirBase);

                mvarFullListDir = lListDirBase;
                mvarCurItem = lCurItem;


                ////
                mvarFlgSinhroCurListAndCurState = false;



                //дальше здесь событие что обновлено
                FireEventUpdateList(EventArgs.Empty);

            }
            catch (Exception e1) { throw e1; }
            finally { }
        }



































































        #region (Конструктор, Singeleton)...

        //Возвращает единственный экземпляр Контроллера себя любимого
        public static TRegDirSoftType GetObject()
        {
            try
            {

                //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1
                //Убираем сингелетон то выяснения причин сбоя при повторном вызове
                //if (mvarRegDirSoftType == null)
                //{

                Collection<TDirSoftType> lListSoftType;
                lListSoftType = TEsb.GetEsb().GetListSoftType();

                Collection<TDirBase> lListDirBase = new Collection<TDirBase>();
                foreach (TDirSoftType h in lListSoftType) { lListDirBase.Add((TDirBase)h); }

                mvarRegDirSoftType = new TRegDirSoftType(lListDirBase);

                //}












                return mvarRegDirSoftType;
            }
            catch (Exception e) { throw e; }
            finally { }
        }



        protected TRegDirSoftType(Collection<TDirBase> pFullListDir)
            : base(pFullListDir)
        {
            try { }
            catch (Exception e) { throw e; }
            finally { }
        }



        #endregion



        public override string Title
        { get { return "Справочник.Категории ПО"; } }











        private string TestDelegateFuncGetSelector(TDirSoftType lDirSoftType)
        {

            return lDirSoftType.Obozn;
        }

    }
}
